package com.qabaco.odondata.view.servicio;

import com.qabaco.odondata.model.entities.Usuario;
import com.qabaco.odondata.model.pojo.ParametrosCostos;
import com.qabaco.odondata.model.servicio.ServicioDB;

import com.qabaco.odondata.model.servicio.ServicioMail;

import com.qabaco.odondata.model.util.Constantes;

import javax.servlet.http.HttpServletRequest;

import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;

public class ServicioGlobal {
    public ServicioGlobal() {
       /* if (servicioCache != null){
            this.setUsuarioConectado(servicioCache.usuarioConectado());    
            this.setServicio(servicioCache.getServicio());
        }else{
          System.out.println("INSTANCIA SERVICIO GLOBAL");
        }*/
            
        /*WebContext ctx = WebContextFactory.get();
        HttpServletRequest req = ctx.getHttpServletRequest();
        if (req.getSession().getAttribute("SERVICIO_GLOBAL_KEY") == null){
            req.getSession().setAttribute("SERVICIO_GLOBAL_KEY", this);
        }else{
            ServicioGlobal srv = (ServicioGlobal)req.getSession().getAttribute("SERVICIO_GLOBAL_KEY");
            req.getSession().setAttribute("SERVICIO_GLOBAL_KEY", this);
            this.usuario = srv.usuario;
            this.servicioDB = srv.servicioDB;
        }*/
        
        
    }
    
    private ServicioDB servicioDB = null;  
    private ServicioMail servicioMail = null; 
    private Usuario usuario = null; // TODO
    private Boolean suscripcionBasica = null; //TODO Verificar el alcance de estas variables
    private Boolean suscripcionPremium = null;
    private Boolean cursandoMesActual = null;
    
    private ParametrosCostos paramCostos;
    
    
    protected void setServicio(ServicioDB servicioDB){        
        this.servicioDB = servicioDB;
    }
    
    protected ServicioDB getServicio(){
        
       // if (servicioDB == null){
            WebContext ctx = WebContextFactory.get();
            HttpServletRequest req = ctx.getHttpServletRequest();
            if (req.getSession().getAttribute("SERVICIO_DB_KEY") == null){
                servicioDB = new ServicioDB();
                req.getSession().setAttribute("SERVICIO_DB_KEY", servicioDB );
            }else{
                servicioDB = (ServicioDB)req.getSession().getAttribute("SERVICIO_DB_KEY");
            }
        //}
        
        return servicioDB;
    }
    
    protected ServicioMail getServicioMail(){
        
       // if (servicioDB == null){
            WebContext ctx = WebContextFactory.get();
            HttpServletRequest req = ctx.getHttpServletRequest();
            if (req.getSession().getAttribute("SERVICIO_MAIL_KEY") == null){
                servicioMail = new ServicioMail();
                req.getSession().setAttribute("SERVICIO_MAIL_KEY", servicioMail );
            }else{
                servicioMail = (ServicioMail)req.getSession().getAttribute("SERVICIO_MAIL_KEY");
              
            }
        
        return servicioMail;
    }    
    
    
    protected Usuario usuarioConectado(){        
        //usuario.setId(1);
        //if (usuario == null){
            WebContext ctx = WebContextFactory.get();
            HttpServletRequest req = ctx.getHttpServletRequest();
            //if (req.getSession().getAttribute("USUARIO") != null){
                usuario = (Usuario)req.getSession().getAttribute("USUARIO");
            //}
        //}                
        return usuario;    
    }
    
    protected void setUsuarioConectado(Usuario u){
        WebContext ctx = WebContextFactory.get();
        HttpServletRequest req = ctx.getHttpServletRequest();
        req.getSession().setAttribute("USUARIO", u);
        usuario = u; 
    }
    
    protected boolean esAdmin(){ 
        Usuario user = usuarioConectado();
        if (user != null && user.getIdRol().intValue() == Constantes.ROL_ADMINISTRADOR)
            return true;
        return false;
    }
    
    protected boolean esOdontologo(){ 
        Usuario user = usuarioConectado();
        if (user != null && user.getIdRol().intValue() == Constantes.ROL_ODONTOLOGO)
            return true;
        return false;
    }
    
    protected boolean esColaborador(){ 
        Usuario user = usuarioConectado();
        if (user != null && user.getIdRol().intValue() == Constantes.ROL_COLABORADOR)
            return true;
        return false;
    }
    
    protected boolean esSecretaria(){ 
        Usuario user = usuarioConectado();
        if (user != null && user.getIdRol().intValue() == Constantes.ROL_SECRETARIA)
            return true;
        return false;
    }
    
    protected void cleanTieneSuscripcionBasica(){ 
          suscripcionBasica = null;
    }
    
    protected void cleanTieneSuscripcionPremium(){ 
          suscripcionPremium = null;        
    }
    
    protected void cleanEstaCursandoMesActual(){ 
          cursandoMesActual = null;        
    }
    
    protected boolean tieneSuscripcionBasica(){ 
      if (usuarioConectado() == null) return false;
      if (suscripcionBasica == null){
          suscripcionBasica = getServicio().tieneSuscripcionActiva(usuarioConectado().getId(), Constantes.PRODUCTO_SUSCRIPCION_BASICA);
      }
      return suscripcionBasica;
    }
    
    protected boolean tieneSuscripcionPremium(){ 
      if (usuarioConectado() == null) return false;
      if (suscripcionPremium == null){
          suscripcionPremium = getServicio().tieneSuscripcionActiva(usuarioConectado().getId(), Constantes.PRODUCTO_SUSCRIPCION_PREMIUM);
      }
      return suscripcionPremium;
    }
    
    protected boolean estaCursandoMesActual(){ 
      if (usuarioConectado() == null) return false;
      if (cursandoMesActual == null){
          cursandoMesActual = getServicio().estaCursandoMesActual(usuarioConectado().getId());
      }
      return cursandoMesActual;
    }

    public void setParamCostos(ParametrosCostos paramCostos) {
        this.paramCostos = paramCostos;
    }

    public ParametrosCostos getParamCostos() {
        if (paramCostos == null)
            paramCostos = getServicio().qParametrosCostos();
        return paramCostos;
    }
}
